import axios from 'axios';
import router from "@/router/index";
import { vToast } from "@/plugins/vToast";

// 创建axios实例
const instance = axios.create({
    // baseURL: 'http://127.0.0.2',
    baseURL: 'https://yingdedao.cn/api',
    timeout: 50000
})

// 请求拦截器
instance.interceptors.request.use(config => {
    // 从 localStorage 获取 token
    const token = localStorage.getItem('token');
    const expire = localStorage.getItem('token_expire');
    if (expire && Date.now() > parseInt(expire) * 1000) {
        handleTokenExpired();
        return Promise.reject(new Error('Token已过期'));
    }
    // 如果 token 存在，注入 Authorization 请求头
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    }

    // POST请求默认处理
    if (config.method?.toLowerCase() === 'post') {
        config.headers['Content-Type'] = 'application/json';
        if (typeof config.data !== 'string' && !(config.data instanceof FormData)) {
            config.data = JSON.stringify(config.data);
        }
    }

    return config
}, err => {
    console.error('请求拦截err:', err);
    return Promise.reject(err)
})

// 响应拦截器
instance.interceptors.response.use(
    res => {
        if (res.data?.code==403) {
            handleTokenExpired();
            return Promise.reject(new Error(res.data?.msg || '登录状态已过期'));
        }
        return res.data
    },
    err => {
        console.error('响应拦截err:', err);

        // 网络无响应（如跨域、超时等）
        if (!err.response) {
            console.error('网络错误，请检查网络连接');
            return Promise.reject(new Error('网络错误，请检查网络连接'));
        }

        const { status, data } = err.response;

        // Token 异常处理
        if ( status === 403) {
            handleTokenExpired();
            return Promise.reject(new Error('登录状态已过期'));
        }

        // 其他HTTP错误状态
        const errorMessage = data?.msg || `请求失败，状态码: ${status}`;
        return Promise.reject(new Error(errorMessage));
    }
)

// Token过期处理函数
function handleTokenExpired() {
    vToast.error("Token无效,请重新登录");

    localStorage.removeItem("token");
    localStorage.removeItem("token_expire");
    setTimeout(() => {
        router.replace({ name: 'login', query: { redirect: router.currentRoute.value.fullPath } });
    }, 1500);
}

/**
 * 通用请求方法
 * @param {Object} config 请求配置
 * @returns {Promise} 返回Promise对象
 */
export function request(config) {
    return instance(config)
}

/**
 * GET请求
 * @param {String} url 请求地址
 * @param {Object} params 请求参数
 * @param {Object} config 额外配置
 * @returns {Promise} 返回Promise对象
 */
export function get(url, params = {}, config = {}) {
    return instance({
        method: 'get',
        url,
        params,
        ...config
    })
}

/**
 * POST请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} config 额外配置
 * @returns {Promise} 返回Promise对象
 */
export function post(url, data = {}, config = {}) {
    return instance({
        method: 'post',
        url,
        data,
        ...config
    })
}

/**
 * 文件上传请求
 * @param {String} url 请求地址
 * @param {FormData} formData 表单数据
 * @param {Function} onUploadProgress 上传进度回调
 * @param {Object} config 额外配置
 * @returns {Promise} 返回Promise对象
 */
export function upload(url, formData, config = {}, onUploadProgress = null) {
    return instance({
        method: 'post',
        url,
        data: formData,
        headers: {
            ...(config.headers || {}),
            'Content-Type': 'multipart/form-data'
        },
        onUploadProgress,
        ...config,
        transformRequest: [function (data, headers) {
            // 确保不修改FormData
            if (data instanceof FormData) {
                return data;
            }
            return JSON.stringify(data);
        }]
    });
}
/**
 * PUT请求
 * @param {String} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} config 额外配置
 * @returns {Promise} 返回Promise对象
 */
export function put(url, data = {}, config = {}) {
    return instance({
        method: 'put',
        url,
        data,
        ...config
    })
}

/**
 * DELETE请求
 * @param {String} url 请求地址
 * @param {Object} config 额外配置
 * @returns {Promise} 返回Promise对象
 */
export function del(url, config = {}) {
    return instance({
        method: 'delete',
        url,
        ...config
    })
}

export default {
    request,
    get,
    post,
    upload,
    put,
    delete: del
}